package com.je.app.control;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.swing.JPanel;





import com.je.app.control.interfaces.ControlCajaInterface;
import com.je.app.model.Movimiento;
import com.je.app.model.Sesion;
import com.je.app.model.Turno;
import com.je.app.persistence.DaoCaja;
import com.je.app.persistence.DaoSesion;
import com.je.app.persistence.DaoTurno;
import com.je.app.view.Caja;
import com.je.app.view.MainFrame;
import com.je.app.view.MainFrame.MessageType;
import com.je.app.view.popUp.ModificarMovimiento;

public class ControlCaja implements ControlCajaInterface {

	private static ControlCaja instance ;
	private MainFrame mainFrame;
	private List <Movimiento> listaIngresos;
	private List <Movimiento> listaEgresos;
	private Movimiento movimientoSeleccionado;
	
	public static ControlCaja getInstance(){
		if(instance==null){
			instance = new ControlCaja();
		}
		return instance;
	}
	
	private ControlCaja(){
		mainFrame = MainFrame.getInstance();
	}

	public void abrirCaja() {

		Sesion sesionActual = ControlSesion.getInstance().getActiveSesion();
		
		List <Turno> turnos = DaoTurno.getInstance().list(ControlSesion.getInstance().getActiveSesion());
		Set <Movimiento> movimientos = sesionActual.getMovimientos();
		double cajaInicial = sesionActual.getCajaInicial();
		double cajaFinal = sesionActual.getCajaFinal();
		
		double totalTurnos = 0;
		double totalEntradas = 0;
		double totalSalidas = 0;
		
		int cantidadEntradas = 0;
		int cantidadSalidas = 0;
		for(Movimiento mov : movimientos){
			if(mov.getTipoMovimiento().equals("Ingreso")) cantidadEntradas++;
			else cantidadSalidas++;
		}
		
		Object[][] modelTurnos = new Object[turnos.size()][9];
		Object[][] modelEntradas = new Object[cantidadEntradas][2];
		Object[][]  modelSalidas = new Object[cantidadSalidas][2];
		
		listaIngresos = new ArrayList <Movimiento> ();
		listaEgresos = new ArrayList <Movimiento> ();
		
		int i = 0;
		for(Turno turno: turnos){
			if(turno.isTerminado()){
				modelTurnos[i] = turno.getArray();
				totalTurnos += turno.getMontoConsumicion();
				totalTurnos += turno.getMontoHabitacion();
			}
			i++;
		}
		
		i = 0;
		int j = 0;
		for(Movimiento movimiento: movimientos){
			if(movimiento.getTipoMovimiento().equals("Ingreso")){
				modelEntradas[i]=movimiento.toArray();
				totalEntradas += movimiento.getMonto();
				i++;
				listaIngresos.add(movimiento);
			}else{
				totalSalidas += movimiento.getMonto();
				modelSalidas[j]=movimiento.toArray();
				
				j++;
				listaEgresos.add(movimiento);
			}
		
			totalTurnos = Math.floor(totalTurnos * 100)/100;
			totalEntradas = Math.floor(totalEntradas * 100)/100;
			totalSalidas = Math.floor(totalSalidas * 100)/100;
			cajaFinal = Math.floor(cajaFinal * 100)/100;
			cajaInicial = Math.floor(cajaInicial * 100)/100;
		}
		
		JPanel panel = new Caja(modelTurnos, modelEntradas, modelSalidas, cajaInicial, cajaFinal, totalTurnos, totalEntradas, totalSalidas);
		mainFrame.setPanel(panel);
		
	}

	public void cerrarCaja() {
		//cierra sesion y abre una nueva
		ControlSesion controlSesion = ControlSesion.getInstance();
		String nombre = controlSesion.getActiveSesion().getUsuario().getIdUsuario();
		String contra = controlSesion.getActiveSesion().getUsuario().getContrasenia();
		controlSesion.getActiveSesion().setHoraFin(new Date());
		DaoSesion.getInstance().persist(controlSesion.getActiveSesion());
		controlSesion.setActiveSesion(null);

		controlSesion.validarUsuario(nombre, contra,null);		
	}

	public void crearMovimiento(String tipoMovimiento, double monto, String detalle, String observacion) {
		Sesion sesion = ControlSesion.getInstance().getActiveSesion();
		Movimiento nuevoMovimiento = new Movimiento(sesion,new Date(),monto,tipoMovimiento,detalle,observacion);
		DaoCaja.getInstance().save(Movimiento.class.toString(), nuevoMovimiento);
		sesion.addMovimiento(nuevoMovimiento);
		DaoSesion.getInstance().save(Sesion.class.toString(), sesion );
		abrirCaja();
		
	}

	public void mostrarModificarMovimiento(int rowModel, String tipoMovimiento){
		if(tipoMovimiento.equals("Ingreso")){
			if(rowModel<listaIngresos.size() && rowModel>=0){
				movimientoSeleccionado = listaIngresos.get(rowModel);
				new ModificarMovimiento(movimientoSeleccionado.getIdMovimiento(),movimientoSeleccionado.getMonto(),movimientoSeleccionado.getDetalle(),movimientoSeleccionado.getObservacion(),tipoMovimiento);
			}
			else{
				//DEBE SELECCIONAR UN MOVIMIENTO
				mainFrame.showMessage(MessageType.ERROR, "Debe seleccionar un movimiento");
			}
		}
		else{
			if(rowModel<listaEgresos.size() && rowModel>=0){
				movimientoSeleccionado = listaEgresos.get(rowModel);
				new ModificarMovimiento(movimientoSeleccionado.getIdMovimiento(),movimientoSeleccionado.getMonto(),movimientoSeleccionado.getDetalle(),movimientoSeleccionado.getObservacion(),tipoMovimiento);
			}
			else{
				//DEBE SELECCIONAR UN MOVIMIENTO
				mainFrame.showMessage(MessageType.ERROR, "Debe seleccionar un movimiento");
			}
		}
		
	}
	
	public void modificarMovimiento(int id, double monto, String detalle, String observacion) {
		if(movimientoSeleccionado.getIdMovimiento()==id){
			movimientoSeleccionado.setDetalle(detalle);
			movimientoSeleccionado.setObservacion(observacion);
			movimientoSeleccionado.setMonto(monto);
			movimientoSeleccionado = null;
			Sesion sesion = ControlSesion.getInstance().getActiveSesion();
			sesion.recalcularSaldo();
			abrirCaja();
		}

	}

	public void eliminarMovimiento(int rowModel, String tipoMovimiento) {
		if(tipoMovimiento.equals("Ingreso")){
			if(rowModel<listaIngresos.size() && rowModel>=0){
				boolean confirmado = mainFrame.showMessage(MessageType.CONFIRMACION, null);
				if(confirmado){
					movimientoSeleccionado = listaIngresos.get(rowModel);
					Sesion sesion = ControlSesion.getInstance().getActiveSesion();
					sesion.eliminarMovimiento(movimientoSeleccionado);
					listaIngresos.remove(movimientoSeleccionado);
					DaoCaja.getInstance().remove(movimientoSeleccionado);
					abrirCaja();
				}
			}
			else{
				//DEBE SELECCIONAR UN MOVIMIENTO
				mainFrame.showMessage(MessageType.ERROR, "Debe seleccionar un movimiento");
			}
		}
		else{
			if(rowModel<listaEgresos.size() && rowModel>=0){
				boolean confirmado = mainFrame.showMessage(MessageType.CONFIRMACION, null);
				if(confirmado){
					movimientoSeleccionado = listaEgresos.get(rowModel);
					Sesion sesion = ControlSesion.getInstance().getActiveSesion();
					sesion.eliminarMovimiento(movimientoSeleccionado);
					listaIngresos.remove(movimientoSeleccionado);
					DaoCaja.getInstance().remove(movimientoSeleccionado);
					abrirCaja();
				}
			}
			else{
				//DEBE SELECCIONAR UN MOVIMIENTO
				mainFrame.showMessage(MessageType.ERROR, "Debe seleccionar un movimiento");
			}
		}
		movimientoSeleccionado = null;
	}

	public void buscarMovimiento(int rowModel) {
		// TODO Auto-generated method stub
		
	}

	public void cerrarMes() {
		// TODO Auto-generated method stub
		
	}
}
